let a: number[] = [];

let a: (string | number)[] = [];

let a: Array<{ foo: Bar[] }> = [];

let a: Array<{ foo: Foo | Bar[] }> = [];

let x: Array<number> = [1] as number[];

let y: string[] = <Array<string>>['2'];

let ya = [[1, '2']] as [number, string][];

let yyyy: Arr<Array<Arr<string>>[]> = [[[['2']]]];

interface ArrayClass<T> {
  foo: Array<T>;
  bar: T[];
  baz: Arr<T>;
}

function barFunction(bar: ArrayClass<String>[]) {
  return bar.map(e => e.bar);
}

let barVar: ((c: number) => number)[];

type barUnion = (string | number | boolean)[];

type barIntersection = (string & number)[];

interface FooInterface {
  '.bar': { baz: string[] };
}

type Unwrap<T> = T extends (infer E)[] ? E : T;

let a: Array<any[]> = [];

